Closures প্রোগ্রামিংয়ের একটি শক্তিশালী ধারণা, যা রুবি সহ অনেক প্রোগ্রামিং ভাষায় ব্যবহৃত হয়। Closure হল এমন একটি ফাংশন (বা ব্লক) যা তার বাইরের স্কোপের ভেরিয়েবলগুলি মনে রাখে এবং সেগুলি ব্যবহার করতে সক্ষম হয়। সহজভাবে বললে, একটি ক্লোজার হল একটি ফাংশন যা তার নিজের লজিক ছাড়াও বাইরের ভেরিয়েবল বা আর্গুমেন্টের উপর ভিত্তি করে কাজ করে।
রুবিতে blocks, procs, এবং lambdas ক্লোজার হিসাবে কাজ করে।
Closures এর মৌলিক ধারণা
ক্লোজার হল একটি ফাংশন বা ব্লক যা নিজের বাইরের ভেরিয়েবল বা অবজেক্টের রেফারেন্স ধরে রাখে এবং সেগুলির উপর কাজ করতে পারে। অর্থাৎ, একটি ক্লোজার এমন একটি ফাংশন যার মধ্যে এক্সিকিউশন কনটেক্সটের বাইরের ভেরিয়েবলগুলি আছেযে গুলি তা যখন প্রয়োগ করা হয় তখনও ব্যবহার করা যায়।
রুবিতে closures সাধারণত blocks, procs, এবং lambdas এর মাধ্যমে তৈরি করা হয়।
Closures এর উদাহরণ: Blocks, Procs, and Lambdas
1. Blocks
রুবিতে ব্লকগুলি হল ক্লোজার তৈরি করার একটি জনপ্রিয় পদ্ধতি। ব্লক সাধারণত মেথড কলের সাথে যুক্ত হয় এবং তাতে প্যারামিটার গ্রহণ করতে পারে। ব্লক নিজে একটি ক্লোজার হতে পারে, কারণ এটি বাইরের স্কোপের ভেরিয়েবলকে "মনে রাখে"।
উদাহরণ:
def greeting(name)
# ব্লক হিসেবে ক্লোজার
yield(name) if block_given?
end
name = "আজিজ"
greeting(name) { |n| puts "Hello, #{n}!" }এখানে, greeting মেথডে একটি ব্লক দেওয়া হয়েছে, যা name প্যারামিটারটি গ্রহণ করে এবং তার উপর কাজ করে। ব্লকটি বাইরের name ভেরিয়েবলকে মনে রেখেছে এবং সঠিকভাবে কাজ করেছে।
আউটপুট:
Hello, আজিজ!2. Procs
Proc হল একটি অবজেক্ট যা একটি ব্লক ধারণ করে এবং এটি ফাংশনের মতো ব্যবহার করা যায়। প্রোকস হল একটি ক্লোজার, কারণ এটি নিজের বাইরের স্কোপের ভেরিয়েবলগুলির সাথে সম্পর্ক রাখতে পারে।
উদাহরণ:
def make_multiplier(factor)
# প্রোক তৈরি করা
Proc.new { |n| n * factor }
end
double = make_multiplier(2)
puts double.call(5) # আউটপুট: 10এখানে, make_multiplier মেথড একটি প্রোক তৈরি করছে, যা বাইরের স্কোপের factor ভেরিয়েবলকে মনে রাখে এবং তার ভিত্তিতে গুণফল বের করে। প্রোকটি পরবর্তীতে call মেথড দিয়ে ব্যবহার করা হয়।
আউটপুট:
103. Lambdas
Lambdas হল প্রোকের মতো, তবে সেগুলির আচরণ কিছুটা ভিন্ন। একটি ল্যাম্বডা একটি ক্লোজার, কিন্তু এটি ফাংশনের মতো কাজ করে, অর্থাৎ এটি প্যারামিটার চেক করে এবং অ্যারগুমেন্টের ভুল দেওয়ার জন্য ত্রুটি ফেরত দেয়।
উদাহরণ:
multiply = lambda { |a, b| a * b }
puts multiply.call(2, 3) # আউটপুট: 6এখানে, lambda একটি ফাংশন তৈরি করেছে যা দুইটি প্যারামিটার গ্রহণ করে এবং তাদের গুণফল বের করে। call মেথড ব্যবহার করে এটি চালানো হয়েছে।
Lambda vs Proc
- Proc: একটি প্রোক একটি ক্লোজার হিসেবে কাজ করতে পারে, তবে এটি প্যারামিটার চেক করে না এবং অতিরিক্ত প্যারামিটার গ্রহণ করলেও কাজ করতে থাকে।
- Lambda: ল্যাম্বডার প্যারামিটার চেকিং রয়েছে এবং অতিরিক্ত প্যারামিটার দিলে ত্রুটি দেখায়।
উদাহরণ:
# Proc Example
proc_example = Proc.new { |a, b| a + b }
puts proc_example.call(1) # আউটপুট: 1 (b প্যারামিটার অনুপস্থিত)
puts proc_example.call(1, 2) # আউটপুট: 3
# Lambda Example
lambda_example = lambda { |a, b| a + b }
puts lambda_example.call(1) # ত্রুটি: wrong number of arguments (1 for 2)এখানে, প্রোক extra প্যারামিটার গ্রহণ করলেও কোনো সমস্যা হয় না, কিন্তু ল্যাম্বা অতিরিক্ত প্যারামিটার দিলে ত্রুটি দেখায়।
Closures এর ব্যবহার
- স্কোপে ভেরিয়েবল ব্যবহার: ক্লোজারের মধ্যে বাইরের স্কোপের ভেরিয়েবল ব্যবহার করা হয়।
- ফাংশনাল প্রোগ্রামিং: ফাংশনাল প্রোগ্রামিংয়ের মতো প্যারামিটার হিসেবে ক্লোজার প্রেরণ করা এবং তার উপর ভিত্তি করে কাজ করা।
- কাস্টম লজিক প্রক্রিয়া: অনেক সময় ক্লোজার ব্যবহার করে কাস্টম লজিক তৈরি করা হয় যেখানে বাইরের স্কোপের পরিবর্তনশীলতা রাখা হয়।
Closures এর সুবিধা
- কোড পুনঃব্যবহারযোগ্যতা: ক্লোজার আপনাকে একই লজিক বিভিন্ন জায়গায় পুনরায় ব্যবহার করার সুবিধা দেয়।
- স্কোপ সংরক্ষণ: ক্লোজার বাইরের স্কোপের ভেরিয়েবলকে মনে রাখে, যা অনেক ক্ষেত্রে কার্যকরী হতে পারে।
- ফাংশনাল প্রোগ্রামিং: ক্লোজারগুলি ফাংশনাল প্রোগ্রামিংয়ের মৌলিক বৈশিষ্ট্য, যেখানে ফাংশনকে আরেকটি ফাংশনের প্যারামিটার হিসেবে ব্যবহার করা যায়।
সারসংক্ষেপ
- Closures হল ফাংশন বা ব্লক যা বাইরের স্কোপের ভেরিয়েবলকে মনে রাখে এবং সেগুলির উপর কাজ করতে পারে।
- রুবিতে blocks, procs, এবং lambdas ক্লোজার হিসাবে কাজ করে।
- Blocks হল এমন ফাংশন যা একটি মেথডের সঙ্গে সংযুক্ত থাকে এবং তার বাইরের ভেরিয়েবল ব্যবহার করতে পারে।
- Procs এবং Lambdas হল ফাংশনাল অবজেক্ট যা বাইরের স্কোপের ভেরিয়েবল ব্যবহার করতে পারে, তবে সেগুলির মধ্যে কিছু পার্থক্য আছে, যেমন প্যারামিটার চেকিং।
Read more